"""
字符串的驻留机制：
    仅保存一份相同且不可变字符串的方法，不同的值被存放在字符串的驻留池之中。

驻留机制的几种情况：
    1、字符串的长度为0或1时。
    2、符合标识符的字符串（只含有数字、字母、下划线，不能以数字开头，不能以关键字重名）
    3、字符串只在编译时进行驻留，而非运行时
    4、[-5,256]之间的整数数字
"""

# 符合标识符，发生驻留机制
a = 'Python'
b = "Python"
c = '''Python'''
print(a, id(a))
print(b, id(b))
print(c, id(c))  # 发现 a,b,c三个字符串共占一个空间
print("================")

# 字符串只在编译时进行驻留，而非运行时
str1 = "abc"
str2 = "ab" + "c"
str3 = "".join(["ab", "c"])
print(str1, id(str1))
print(str2, id(str2))
print(str3, id(str3))  # 内存地址和上面的不一样
print("================")

# 强制驻留
import sys

s1 = "abc%"
s2 = "abc%"
print(s1 is s2) # 本应该是False，Pycharm内做了优化
s1 = sys.intern(s2)
print(s1 is s2)

# 字符串的比较
print('apple' > 'app')  # True
print('apple' > 'banana')  # False，相当于97 > 98 > False
print(ord('a'), ord('b'))
print(ord('杨'))

print(chr(97), chr(98))
print(chr(26472))

'''
== 与 is 的区别：
    ==  比较的是 value
    is  比较的是id是否相等
'''
a = b = 'Python'
c = 'Python'
print(a == b)  # True
print(b == c)  # True

print(a is b)  # True
print(a is c)  # True
print(id(a))  # 2204259933168
print(id(b))  # 2204259933168
print(id(c))  # 2204259933168